#include <windows.h>
#include <windowsx.h>
#include "dialog.h"

StrumienWejsciowy ** str;
int liczbaStrumieni;
StrumienWejsciowy ** nowyStr;
int nowaLiczbaStrumieni;
// Procedura dialogowa
BOOL CALLBACK DlgParametryProc( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_INITDIALOG:  
    {
          str = sym->kopiujStrumienieWejsciowe();
          liczbaStrumieni = sym->getLiczbaStrumieniWejsciowych();
          
          HWND hLiczbaStrumieni = GetDlgItem(hwnd, IDET_LICZBA_STRUMIENI);
          SetWindowText( hLiczbaStrumieni, sym->intToChar(liczbaStrumieni));
          
          SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_RESETCONTENT, 0, 0 );
          for (int i=0; i<liczbaStrumieni;i++)
          {
              SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_ADDSTRING, 0, (LPARAM) sym->intToChar(i+1) );
              SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_SETCURSEL, i, 0 );
          }

          SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_SETCURSEL, 0, 0 );
                   
          HWND hLiczbaZadan = GetDlgItem(hwnd, IDET_LICZBA_ZADAN);
          SetWindowText( hLiczbaZadan,   sym->intToChar(str[0]->getLiczbaZadan()));
          
          HWND hLambda = GetDlgItem(hwnd, IDET_LAMBDA);
          SetWindowText( hLambda,   sym->floatToChar(str[0]->getLambda()));
          
          HWND hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_WYKLADNICZY);
          SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
          
          if (str[0]->getRozklad() == 0)
          {
               hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_JEDNOSTAJNY);
               SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
          }
          else if (str[0]->getRozklad() == 1)
          {
               hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_NORMALNY);
               SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
          }
          
          HWND hOd = GetDlgItem(hwnd, IDET_ZAKRES_OD);
          SetWindowText( hOd,sym->intToChar(str[0]->getZakresOd()));
          
          HWND hDo = GetDlgItem(hwnd, IDET_ZAKRES_DO);
          SetWindowText( hDo, sym->intToChar(str[0]->getZakresDo()));
       
          HWND hSrednia = GetDlgItem(hwnd, IDET_SREDNIA);
          SetWindowText( hSrednia, sym->floatToChar(str[0]->getSrednia()));
          
          HWND hOdch = GetDlgItem(hwnd, IDET_ODCHYLENIE);
          SetWindowText( hOdch, sym->floatToChar(str[0]->getOdchylenie()));

    }
    break;
    case WM_COMMAND:
        {
            // reakcja na przyciski
            switch( LOWORD( wParam ) )
            {
            case IDC_BUTTON_ZMIEN_LICZBE_STRUMIENI:
                 {
                     HWND hLiczbaStrumieni = GetDlgItem(hwnd, IDET_LICZBA_STRUMIENI);
                     char * tmp = new char[10];
                     GetWindowText(hLiczbaStrumieni, tmp, 10);
                     nowaLiczbaStrumieni = atoi(tmp);
                     if (nowaLiczbaStrumieni <= 0) nowaLiczbaStrumieni = 1;
                     SetWindowText( hLiczbaStrumieni, sym->intToChar(nowaLiczbaStrumieni));
                     
                     if (nowaLiczbaStrumieni != liczbaStrumieni)
                     {
                         nowyStr = new StrumienWejsciowy *[nowaLiczbaStrumieni];
                         for (int i =0; i<nowaLiczbaStrumieni; i++)
                             nowyStr[i] = new StrumienWejsciowy(i+1);
                         
                         int limit;    
                         if (nowaLiczbaStrumieni < liczbaStrumieni)
                             limit = nowaLiczbaStrumieni;
                         else limit = liczbaStrumieni;
                         
                         for (int i =0; i<limit; i++)
                         {
                            nowyStr[i]->setLambda(str[i]->getLambda());
                            nowyStr[i]->setZakresOd(str[i]->getZakresOd());
                            nowyStr[i]->setZakresDo(str[i]->getZakresDo());
                            nowyStr[i]->setSrednia(str[i]->getSrednia());
                            nowyStr[i]->setOdchylenie(str[i]->getOdchylenie());
                            nowyStr[i]->setRozklad(str[i]->getRozklad());
                            nowyStr[i]->setLiczbaZadan(str[i]->getLiczbaZadan());
                         }
                         
                          for (int i =0; i<liczbaStrumieni; i++)
                              delete str[i];
                          delete [] str;
                          
                          liczbaStrumieni = nowaLiczbaStrumieni;
                          str = nowyStr;
                          nowyStr = NULL;
                          nowaLiczbaStrumieni = 0;
                         
                         
                         SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_RESETCONTENT, 0, 0 );
                         for (int i=0; i<liczbaStrumieni;i++)
                         {
                             SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_ADDSTRING, 0, (LPARAM) sym->intToChar(i+1) );
                             SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_SETCURSEL, i, 0 );
                         }
                         SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_SETCURSEL, 0, 0 );
                     }
                     
                 }
                 break;
            case IDCMB_NR_STRUMIENI:
                 {
                    int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                       
                      HWND hLiczbaZadan = GetDlgItem(hwnd, IDET_LICZBA_ZADAN);
                      SetWindowText( hLiczbaZadan,   sym->intToChar(str[zazn]->getLiczbaZadan()));
                      
                      HWND hLambda = GetDlgItem(hwnd, IDET_LAMBDA);
                      SetWindowText( hLambda,   sym->floatToChar(str[zazn]->getLambda()));
                      
                      HWND hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_WYKLADNICZY);
                      SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
                      
                      if (str[zazn]->getRozklad() == 0)
                      {
                           hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_JEDNOSTAJNY);
                           SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
                           hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_NORMALNY);
                           SendMessage(hRW, BM_SETCHECK, BST_UNCHECKED, 0);
                      }
                      else if (str[zazn]->getRozklad() == 1)
                      {
                           hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_NORMALNY);
                           SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
                           hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_JEDNOSTAJNY);
                           SendMessage(hRW, BM_SETCHECK, BST_UNCHECKED, 0);
                      }
                      
                      HWND hOd = GetDlgItem(hwnd, IDET_ZAKRES_OD);
                      SetWindowText( hOd,sym->intToChar(str[zazn]->getZakresOd()));
                      
                      HWND hDo = GetDlgItem(hwnd, IDET_ZAKRES_DO);
                      SetWindowText( hDo, sym->intToChar(str[zazn]->getZakresDo()));
                   
                      HWND hSrednia = GetDlgItem(hwnd, IDET_SREDNIA);
                      SetWindowText( hSrednia, sym->floatToChar(str[zazn]->getSrednia()));
                      
                      HWND hOdch = GetDlgItem(hwnd, IDET_ODCHYLENIE);
                      SetWindowText( hOdch, sym->floatToChar(str[zazn]->getOdchylenie()));

                 }
                 break;
                                                   
            case IDRB_ROZKLAD_JEDNOSTAJNY:
                {
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setRozklad (0)   ;
                         
                     HWND hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_JEDNOSTAJNY);
                     SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
                     hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_NORMALNY);
                     SendMessage(hRW, BM_SETCHECK, BST_UNCHECKED, 0);
                }
                break;

            case IDRB_ROZKLAD_NORMALNY:
                {
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setRozklad (1) ;  
      
                      HWND hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_NORMALNY);
                      SendMessage(hRW, BM_SETCHECK, BST_CHECKED, 0);
                      hRW = GetDlgItem(hwnd, IDRB_ROZKLAD_JEDNOSTAJNY);
                      SendMessage(hRW, BM_SETCHECK, BST_UNCHECKED, 0);
                }
                break;
                
            case IDET_LICZBA_ZADAN:
                {
                     HWND hLiczbaZadan = GetDlgItem(hwnd, IDET_LICZBA_ZADAN);
                     char * tmp = new char[10];
                     GetWindowText(hLiczbaZadan, tmp, 10);
                     int liczba = atoi(tmp);
                     if (liczba <= 0 ) liczba = 1;
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setLiczbaZadan (liczba) ;  
                }
                break;
            
            case IDET_LAMBDA:
                {
                     HWND hLambda = GetDlgItem(hwnd, IDET_LAMBDA);
                     char * tmp = new char[10];
                     GetWindowText(hLambda, tmp, 10);
                     float liczba = atof(tmp);
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setLambda (liczba) ;  
                }
                break;
            
            case IDET_ZAKRES_OD:
                {
                     HWND hOd = GetDlgItem(hwnd, IDET_ZAKRES_OD);
                     char * tmp = new char[10];
                     GetWindowText(hOd, tmp, 10);
                     int liczba = atoi(tmp);
                     if (liczba <= 0 ) liczba = 1;
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setZakresOd (liczba) ;  
                }
                break;
            
            case IDET_ZAKRES_DO:
                {
                     HWND hDo = GetDlgItem(hwnd, IDET_ZAKRES_DO);
                     char * tmp = new char[10];
                     GetWindowText(hDo, tmp, 10);
                     int liczba = atoi(tmp);
                     if (liczba <= 0 ) liczba = 1;
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setZakresDo (liczba) ;  
                }
                break;
                
            case IDET_SREDNIA:
                {
                     HWND hSrednia = GetDlgItem(hwnd, IDET_SREDNIA);
                     char * tmp = new char[10];
                     GetWindowText(hSrednia, tmp, 10);
                     float liczba = atof(tmp);
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setSrednia (liczba) ;  
                }
                break;
            
            case IDET_ODCHYLENIE:
                {
                     HWND hOdch = GetDlgItem(hwnd, IDET_ODCHYLENIE);
                     char * tmp = new char[10];
                     GetWindowText(hOdch, tmp, 10);
                     float liczba = atof(tmp);
                     int zazn = SendMessage( GetDlgItem(hwnd, IDCMB_NR_STRUMIENI), CB_GETCURSEL, 0, 0 );
                     str[zazn]->setOdchylenie (liczba) ;  
                }
                break;

            case IDOK: 
                 {
                 sym->ustawStrumienieWejsciowe (liczbaStrumieni, str);
                 for (int i=0; i<liczbaStrumieni; i++)
                     delete str[i];
                 delete [] str;
                 EndDialog( hwnd, IDOK ); 
                 }
                 break;
            case IDCANCEL: 
                 {
                     for (int i=0; i<liczbaStrumieni; i++)
                         delete str[i];
                     delete [] str;
                     EndDialog( hwnd, IDCANCEL ); break;
                 }
            }
        }
        break;
       
        default: return FALSE;
    }
   
    return TRUE;
}
